package com.shuqing.download.engine.distribute.dispatch;

import cn.hutool.core.util.StrUtil;
import com.shuqing.download.engine.DownLoadTaskDto;
import com.shuqing.download.engine.constants.ActuatorEnum;
import com.shuqing.download.engine.constants.BaseConstants;
import com.shuqing.download.engine.constants.TaskStatusEnum;
import lombok.Data;

import java.util.function.BiConsumer;

/**
 * 任务上下文
 * @author wangshuqing
 * @date 2023/3/4 8:52
 */
@Data
public class TaskContext {
    /**任务实体**/
    private DownLoadTaskDto task;
    /**当前状态**/
    private TaskStatusEnum taskStatus;
    /**取数结果**/
    /**输出文件名不带后缀**/
    protected String fileName;
    /**输出文件名带后缀**/
    protected String fileNameWithSuffix;
    /**文件绝对地址,和文件名会有不一样**/
    protected String fileAbsolutePath;
    /**总行数:不包含表头**/
    protected int totalSize;
    /***附件上传完成后文件服务器id*/
    private String fileStoreId;
    /**开始时间**/
    private long startTime;
    /**上次时间**/
    private long preTime;
    /**最后时间**/
    private long lastTime;

    public TaskContext(){
        //初始状态
        resetConsumeTime();
        updateStatus(TaskStatusEnum.QUEUE,null);
    }

    public TaskContext(DownLoadTaskDto task){
        if(StrUtil.isBlank(task.getActuator())){
            task.setActuator(ActuatorEnum.ASSEMBLE_EASY_EXCEL.getCode());
        }
        task.setUploadActuator(ActuatorEnum.UPLOAD_DEFAULT.getCode());
        this.task=task;
        resetConsumeTime();
        updateStatus(TaskStatusEnum.QUEUE,null);
    }

    /**
    * 更新状态
    * @date 2023/3/4 17:04
    * @author wangshuqing
    * @param newStatus 新状态
    * @param isChangeConsumer 状态变更后的操作 <T,V>  T:新状态 V:老状态
    * */
    public void updateStatus(TaskStatusEnum newStatus,
                             BiConsumer<TaskStatusEnum,TaskStatusEnum> isChangeConsumer){
        if(newStatus==null){
            return;
        }
        if(!newStatus.equals(taskStatus) && isChangeConsumer!=null){
            isChangeConsumer.accept(newStatus,taskStatus);
        }
        taskStatus=newStatus;
    }

    /**
    * 重置 关键的几个时间点
    * @date 2023/3/4 19:36
    * @author wangshuqing
    * @param
    * */
    public void resetConsumeTime(){
        Long now=System.currentTimeMillis();
        long defaultTime=0L;
        if(startTime==defaultTime){
            startTime=now;
        }
        if(preTime==defaultTime){
            preTime=startTime;
        }
        if(lastTime==defaultTime){
            lastTime=preTime;
        }
        preTime=lastTime;
        lastTime=now;
    }
    /**
    * 获取全程消耗时间
    * @date 2023/3/4 10:45
    * @author wangshuqing
    * @param
     *@return long
    * */
    public Integer getFullConsumeTime(){
        Long val=lastTime-startTime;
        return val.intValue();
    }

    /**
    * 最近一次耗时
    * @date 2023/3/4 18:25
    * @author wangshuqing
    * @param
     *@return java.lang.Integer
    * */
    public Integer getLastConsumeTime(){
        Long val=lastTime-preTime;
        return val.intValue();
    }




}
